package main

import "fmt"

func main() {
	weiCal()
}
func base() {
	//二进制
	i := 17
	//10001
	fmt.Printf("%b\n", i)
	//21
	fmt.Printf("八进制:%o\n", i)
	//11
	fmt.Printf("十六进制:%x\n", i)
	//11
	fmt.Printf("十六进制:%X\n", i)

	//十六进制表示
	x := 0x11
	fmt.Println(x)

	y := 10
	fmt.Println(y)
}

/*
	0.二进制最高位为符号位，0为正数，1为负数
	1.整数的原码、反码和补码都一样
	2.负数的反码=原码符号位不变，其他位取反
	3.负数的补码=反码+1
	4.0的反码补码都是0
	5.计算机运算时都是按照补码运算
*/
/*
	位运算：
	1.&： 	1&1->1 其他都是0
	2.|:	0|0 -> 0 其他都是1
	3.^:	1^0 or 0^1 -> 1 手动分隔 1^1 or 0^0 -> 0,即不同为1，相同为0

	位移:
	右移 >> : 低位溢出，符号位不变，用符号位补充溢出的高位
	左移 << : 符号位不变，低位补０
*/
func weiCal() {
	//	2&3=0000 0010 & 0000 0011 = 0000 0010 = 2
	fmt.Println(2 & 3)

	//	2|3=0000 0010 | 0000 0011 = 0000 0011 = 3
	fmt.Println(2 | 3)

	//	2^3=0000 0010 | 0000 0011 = 0000 0001 = 1
	fmt.Println(2 ^ 3)

	//  -2^2 = 1111 1110[补码] ^ 0000 0010 [补码]= 1111 1100[补码]=1111 1011[反码]=10000 0100=-4
	fmt.Println(-2 ^ 2)

	//位移运算

	// 0000 0001 >> 2 = 0000 0000 =0 = 1 / 2^2 =0
	fmt.Println("1 >> 2:", 1>>2)
	// 8 / 2^2=2
	fmt.Println("8 >> 2:", 8>>2)
	// 16 / 2^3 = 2
	fmt.Println("16 >> 3:", 16>>3)

	// 0000 0001 << 2 = 0000 0100=4 =1*2^2
	fmt.Println("1 << 2:", 1<<2)
	// 也就相当于1*2^3
	fmt.Println("1 << 3:", 1<<3)

	// 2 * 2^3 =16
	fmt.Println("2 << 3:", 2<<3)

}
